home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / BEERSRC.ZIP / HISCORE.C < prev    next >
Encoding:
C/C++ Source or Header  |  1994-01-10  |  6.5 KB  |  262 lines

  1. // module hiscore.c
  2. // [c] copyright 1993 by ALPHA-HELIX
  3.  
  4. #pragma hdrstop
  5.  
  6. #include <bios.h>
  7. #include <string.h>
  8. #include <dos.h>
  9. #include <fcntl.h>
  10. #include <io.h>
  11. #include <sys\stat.h>
  12. #include <alloc.h>
  13.  
  14. #define    MAXENTRIES    8
  15. #define    NOCP        15    // Number of Chars playername
  16. #define    NOCW        33    // Number of Chars winnertext
  17. #define YOFFS        60    // Y-offset for listbegin
  18. #define SXOFFS        255     // X-offset for centiliter
  19. #define NXOFFS        55    // X-offset for names
  20.  
  21. #include "xmode.h"
  22. #include "sound.h"
  23. #include "fileman.h"
  24. #include "baller.h"
  25.  
  26. struct playerdatas{
  27.    long score;
  28.    char name[NOCP+1];
  29. };
  30.  
  31. struct highscoretext{
  32.    struct playerdatas player[MAXENTRIES];
  33.    char winnertext[NOCW+1];
  34. };
  35.  
  36. static struct highscoretext hstxt={{{   81000L, "ATOMMUELL"},
  37.                     {   29600L, "POWER"},
  38.                     {   14800L, "JUBEL"},
  39.                     {    8110L, "ZYNAX"},
  40.                     {    8099L, "HEAVY"},
  41.                     {    6367L, "WASSERGLAS"},
  42.                     {    4558L, "TWEETY"},
  43.                     {       1L, "TRITONE"}},
  44.                    "EIN PROSIT AUF ALPHA-HELIX"};
  45.  
  46. static void cursorblink(int x, int y, char symbol, struct sprstrc *font)
  47. {
  48.    int set;
  49.  
  50.    set=FALSE;
  51.    if(symbol==0) symbol=' ';
  52.    while(bioskey(1)==0){
  53.       if(set==0){
  54.      set=8;
  55.      putspritedirect(font, x, y, 3);
  56.       }
  57.       if(set==4){
  58.      putspritedirect(font, x, y, symbol-' ');
  59.       }
  60.       set--;
  61.       waitfortick();
  62.    }
  63.    if(set>3) putspritedirect(font, x, y, symbol-' ');
  64. }
  65.  
  66. static void codescore(void)
  67. {
  68.    int i,j;
  69.  
  70.    for(j=0;j<MAXENTRIES;j++){
  71.       for(i=0;i<=NOCP;i++){
  72.      hstxt.player[j].name[i]+=3*i;
  73.       }
  74.       hstxt.player[j].score+=123456789;
  75.    }
  76.    for(j=0;j<=NOCW;j++){
  77.       hstxt.winnertext[j]+=j*2;
  78.    }
  79. }
  80.  
  81. static void decodescore(void)
  82. {
  83.    int i,j;
  84.  
  85.    for(j=0;j<MAXENTRIES;j++){
  86.       for(i=0;i<=NOCP;i++){
  87.      hstxt.player[j].name[i]-=3*i;
  88.       }
  89.       hstxt.player[j].score-=123456789;
  90.    }
  91.    for(j=0;j<=NOCW;j++){
  92.       hstxt.winnertext[j]-=j*2;
  93.    }
  94. }
  95.  
  96. void loadhighscore(int *filvar)
  97. {
  98.    read(*filvar, &hstxt, sizeof(struct highscoretext));
  99.    decodescore();
  100. }
  101.  
  102. void savehighscore(int *filvar)
  103. {
  104.    codescore();
  105.    write(*filvar, &hstxt, sizeof(struct highscoretext));
  106.    decodescore();
  107. }
  108.  
  109. void highscore(char fullmode)
  110. {
  111.    int i,j,x,xs,currentpl,inlist;
  112.    char keys;
  113.    void *ptr;
  114.    int filvar;
  115.    void far *buffer;
  116.    struct sprstrc *font2, *font;
  117.  
  118.    setvanillapalette(0);
  119.    setpage(0); showpage(0); clearscreen();
  120.    ptr = loadfile(datapool, "score.pcx");
  121.    showpcx256(ptr, 0);
  122.    unloadfile(ptr);
  123.  
  124.    font  = loadfile(datapool, "font1.spr");
  125.    font2 = loadfile(datapool, "font2.spr");
  126.    buffer = farmalloc(120*1024L);
  127.    filvar = openfile(datapool, "hs.snd");
  128.  
  129. // Checking for a place in the highscore
  130.  
  131.    inlist=FALSE;
  132.    if(fullmode){
  133.       currentpl=0;
  134.       while(!inlist && currentpl<MAXENTRIES){
  135.      if(score<=hstxt.player[currentpl].score) currentpl++;
  136.      else inlist=TRUE;
  137.       }
  138.  
  139. // Is in highscore
  140.  
  141.       if(inlist){
  142.      for(i=MAXENTRIES-1; i>currentpl; i--) hstxt.player[i]=hstxt.player[i-1];
  143.      strcpy(hstxt.player[currentpl].name,"");
  144.      hstxt.player[currentpl].score=score;
  145.      if(currentpl==0) strcpy(hstxt.winnertext,"");
  146.  
  147.       }
  148.    }
  149. // Show new highscore
  150.  
  151.    for(i=0;i<MAXENTRIES;i++){
  152.       writetext(NXOFFS,YOFFS+i*14,hstxt.player[i].name,font);
  153.       writenumber(SXOFFS,YOFFS+i*14,hstxt.player[i].score,font);
  154.    }
  155.    x=(320-strlen(hstxt.winnertext)*font2->xs)/2;
  156.    writetext(x,YOFFS+(MAXENTRIES+3)*14-6,hstxt.winnertext,font2);
  157.    playfile(filvar, buffer, 120);
  158.    glowin(0);
  159.  
  160. // Enter name
  161.  
  162.    if(inlist){
  163.       xs=font->xs;
  164.       i=0;
  165.       x=NXOFFS;
  166.       setvect(0x09, int09);
  167.       do{
  168.      cursorblink(x,YOFFS+currentpl*14,hstxt.player[currentpl].name[i],font);
  169.      keys=bioskey(0) & 0xFF;
  170.      if(keys<=122 && keys>=97) keys-=32;
  171.      if((keys<=90 && keys>=65) || keys==63 || keys == 46 ||
  172.         keys==39 || (keys<=57 && keys >=48) ||
  173.         keys==32 || keys==33 || keys==34){
  174.         hstxt.player[currentpl].name[i]=keys;
  175.         hstxt.player[currentpl].name[i+1]=0;
  176.         putspritedirect(font, x, YOFFS+currentpl*14, keys-' ');
  177.         if(i<NOCP-1){
  178.            i++;
  179.            x+=xs;
  180.         }
  181.      }
  182.      else if(keys==0x08 && i>0){
  183.         if(i!=(NOCP-1) || hstxt.player[currentpl].name[NOCP-1]==0){
  184.            i--;
  185.            x-=xs;
  186.         }
  187.         hstxt.player[currentpl].name[i]=0;
  188.         putspritedirect(font, x, YOFFS+currentpl*14, 0);
  189.      }
  190.       }while(keys!=0x0d);
  191.       if(hstxt.player[currentpl].name[0]==0){
  192.      strcpy(hstxt.player[currentpl].name,"TOO DRUNK");
  193.      writetext(x,YOFFS+currentpl*14,hstxt.player[currentpl].name,font);
  194.       }
  195.  
  196. // Winnertext
  197.  
  198.       if(currentpl==0){
  199.      writetext(64, YOFFS+(MAXENTRIES+1)*14+8, "PLEASE ENTER WINNER TEXT", font);
  200.      i=0;
  201.      xs=font2->xs;
  202.      do{
  203.         if(i == NOCW){
  204.            x = (320 + (NOCW-3) * xs) / 2;
  205.            cursorblink(x,YOFFS+(MAXENTRIES+3)*14-6,hstxt.winnertext[i-1],font2);
  206.         }else{
  207.            x = (320 + (i-1) * xs) / 2;
  208.            cursorblink(x,YOFFS+(MAXENTRIES+3)*14-6,hstxt.winnertext[i],font2);
  209.         }
  210.         keys=bioskey(0) & 0xFF;
  211.         if(keys<=122 && keys>=97) keys-=32;
  212.         if((keys<=93 && keys>=65) || (keys<=59 && keys>=39) ||
  213.             keys==32 || keys==33 || keys==34 ||
  214.             keys==61 || keys==63){
  215.            if(i<NOCW){
  216.           hstxt.winnertext[i]=keys;
  217.           hstxt.winnertext[i+1]=0;
  218.           i++;
  219.            }else{
  220.           hstxt.winnertext[NOCW-1]=keys;
  221.           hstxt.winnertext[NOCW]=0;
  222.            }
  223.            clearregion(YOFFS+(MAXENTRIES+3)*14-5,10);
  224.            writetext((320-(i+1)*xs)/2,YOFFS+(MAXENTRIES+3)*14-6,hstxt.winnertext,font2);
  225.         }
  226.         else if(keys==0x08 && i>0){
  227.            i--;
  228.            hstxt.winnertext[i]=0;
  229.            clearregion(YOFFS+(MAXENTRIES+3)*14-5,10);
  230.            writetext((320-(i+1)*xs)/2,YOFFS+(MAXENTRIES+3)*14-6,hstxt.winnertext,font2);
  231.         }
  232.      }while(keys!=0x0d);
  233.      if(hstxt.winnertext[0]==0){
  234.         strcpy(hstxt.winnertext,"TOO DRUNK TO WRITE DOWN A TEXT!!!");
  235.         x=(320-strlen(hstxt.winnertext)*xs)/2;
  236.         writetext(x,YOFFS+(MAXENTRIES+3)*14-6,hstxt.winnertext,font2);
  237.      }
  238.  
  239.      writetext(64, YOFFS+(MAXENTRIES+1)*14+8, "                        ", font);
  240.  
  241.       }
  242.       setvect(0x09, newint09);
  243.       saveconfig();
  244.    }else if(fullmode){
  245.  
  246. // Not in highscore
  247.  
  248.       writetext(NXOFFS,YOFFS+(MAXENTRIES+1)*14-3,"YOUR SCORE",font);
  249.       writenumber(SXOFFS,YOFFS+(MAXENTRIES+1)*14-3,score,font);
  250.    }
  251.    while(pressedkeys && soundbusy());
  252.    while(!pressedkeys && soundbusy());
  253.    glowout();
  254.  
  255.    haltsound();
  256.    closefile(filvar);
  257.    farfree(buffer);
  258.    unloadfile(font2);
  259.    unloadfile(font);
  260. }
  261.  
  262.